/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function (s) {
    //如果字符串能组成有效的括号，则长度一定是偶数
    if (s.length % 2 !== 0) return false
    const stk = []
    //用栈存储括号对
    const map = new Map(
        [
            [')', '('],
            [']', '['],
            ['}', '{']
        ]
    )
    for (let i of s) {
        //遇到右括号则判断右括号是否能和栈顶元素匹配
        if (map.has(i)) {
            if (!stk.length || stk[stk.length - 1] !== map.get(i)) return false
            stk.pop()
        } else {
            //如果遇到左括号入栈
            stk.push(i)
        }
    }
    //循环结束的时候还要判断栈是否为空
    return !stk.length
};